// Generator函数
function* fn() {
    console.log("aaa", 1);
    return 123;
}
const g = fn();
console.log(g, 2); // Object [Generator] {}
// 生成器对象也实现了迭代器接口
console.log(g.next(), 3);

// 生成器函数要搭配关键词yield
// 生成器函数会返回一个生成器对象
// 调用这个对象的next方法才会让这个函数的函数体开始执行
// 遇到yield关键词函数执行就会暂停下来,yield后面的值会作为next的结果返回
function* foo() {
    console.log(1111);
    yield 100;
    console.log(2222);
    yield 200;
    console.log(3333);
    yield 300;
}
const generator = foo();
console.log(generator.next());
console.log(generator.next());
console.log(generator.next());

// 简单实现一个发号器
function* creatIdMaker() {
    let id = 1;
    while (true) {
        yield id++;
    }
}
const inMaker = creatIdMaker();
console.log(inMaker.next().value); // 1
console.log(inMaker.next().value); // 2
console.log(inMaker.next().value); // 3

// 使用generator函数实现iterator方法
const todoS = {
    life: ["吃饭", "睡觉", "敲代码"],
    work: ["喝茶", "吃水果"],
    // each方法遍历对象内两个数组的值,不使用迭代器时
    each: function (callback) {
        const arr = [...this.life, ...this.work];
        for (const item of arr) {
            callback(item);
        }
    },
    // 使用生成器实现iterator
    [Symbol.iterator]: function* () {
        const arr = [...this.life, ...this.work];
        for (const item of arr) {
            yield item;
        }
    },
};
for (let item of todoS) {
    console.log(item);
}
